package operacionesMesa;

import java.util.Date;
import java.util.Properties;

import javax.activation.CommandMap;
import javax.activation.MailcapCommandMap;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Mail extends javax.mail.Authenticator { 
	 private String _user; 
	 private String _pass; 
	
	 private String[] _to; 
	 private String _from; 
	
	 private String _port; 
	 private String _sport; 
	
	 private String _host; 
	
	 private String _subject; 
	 private String _body; 
	
	 private boolean _auth; 
	  
	 private boolean _debuggable; 	
	
	 public Mail() { 
		 _host = "smtp.gmail.com"; // default smtp server 
	  	 _port = "465"; // default smtp port 
	  	 _sport = "465"; // default socketfactory port 
	
	  	 _user = ""; // username 
	  	 _pass = ""; // password 
	  	 _from = ""; // email sent from 
	  	 _subject = ""; // email subject 
	  	 _body = ""; // email body 
	
	  	 _debuggable = false; // debug mode on or off - default off 
	  	 _auth = true; // smtp authentication - default on 
	   
	  	 // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
	  	 MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
	  	 mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
	  	 mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
	  	 mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
	  	 mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
	  	 mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
	  	 CommandMap.setDefaultCommandMap(mc); 
	 } 
	
	public Mail(String user, String pass) { 
		this(); 
	
	   	_user = user; 
	   	_pass = pass; 
	 } 
	
	public boolean send() throws Exception { 
		Properties props = _setProperties(); 
	
		if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
			Session session = Session.getInstance(props, this); 
	
			final Message msg = new MimeMessage(session); 
	
			msg.setFrom(new InternetAddress(_from)); 
	      
			InternetAddress[] addressTo = new InternetAddress[_to.length]; 
			for (int i = 0; i < _to.length; i++) { 
				addressTo[i] = new InternetAddress(_to[i]); 
			} 
			msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 
	
			msg.setSubject(_subject); 
			msg.setSentDate(new Date()); 
	
			// setup message body 
			msg.setText(_body);
	     
			// send email 
			new Thread(new Runnable() {
	    	    public void run() {
	    	       try {
					Transport.send(msg);
				} catch (MessagingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} 
	    	    }
	    	}).start();
			return true; 
		} else { 
			return false; 
	   } 
	 } 
	
	 @Override 
	 public PasswordAuthentication getPasswordAuthentication() { 
		 return new PasswordAuthentication(_user, _pass); 
	 } 
	
	 private Properties _setProperties() { 
		 Properties props = new Properties(); 
	
		 props.put("mail.smtp.host", _host); 
	
		 if(_debuggable) { 
			 props.put("mail.debug", "true"); 
		 } 
	
		 if(_auth) { 
			 props.put("mail.smtp.auth", "true"); 
		 } 
	
		 props.put("mail.smtp.port", _port); 
		 props.put("mail.smtp.socketFactory.port", _sport); 
		 props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
		 props.put("mail.smtp.socketFactory.fallback", "false"); 
	
		 return props; 
	 } 
	
	 // the getters and setters 
	 public String getBody() { 
		 return _body; 
	 } 
	
	 public void setBody(String _body) { 
		 this._body = _body; 
	 } 
	
	 public String[] getTo(){
		 return _to;
	 } 
	 public void setTo(String[] _to){
		 this._to=_to;
	 }
	 
	 public String getFrom(){
		 return _from;
	 }
	 
	 public void setFrom(String _from){
		 this._from=_from;
	 }
	 
	 public void setUser(String _user){
		 this._user=_user;
	 }
	 
	 public String getUser(){
		 return _user;
	 } 
	 public void setPass(String _pass){
		 this._pass=_pass;
	 } 
	 public String getPass(){
		 return _pass;
	 }
	 
	 public String getSubject(){
		 return _subject;
	 } 
	 
	 public void setSubject(String _subject){
		 this._subject=_subject;
	 }	 
} 

